package arithmetic.leetcode;

import java.io.IOException;

public class Q2_两数相加 {


    /**
     * 相加的逻辑 每个ListNode 都是一个[9,8,3] 数据，通过next ，next
     * @param l1
     * @param l2
     * @return
     */
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // [a,b,c,d]      [1,2,3]
        ListNode root = new ListNode(0); //
        // 必须声明一个 cursor，每次迭代下去赋值
        ListNode cursor = root;
        int carry = 0;
        //l1/l2任意 一个不为null ，或者 carry!=0 --->代表有进位
        while(l1 != null || l2 != null || carry != 0) {
            int l1Val = l1 != null ? l1.val : 0;
            int l2Val = l2 != null ? l2.val : 0;
            // 加上前一组进位的值
            int sumVal = l1Val + l2Val + carry;
            carry = sumVal / 10;

            // 两数的和，对10取模的结果，创建 ListNode 对象 428
            ListNode sumNode = new ListNode(sumVal % 10);
            // 把428对象，赋值给cursor.next
            /**
                 * 0
                 *  (a+1)%10
                 *      (b+2)%10+carry
                 *          (c+3)%10+carry
                 *              (d+0)%10+carry
                 *                  carry
             */
            cursor.next = sumNode;
            // 把428 赋值给 cursor
            cursor = sumNode;

            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }

        return root.next;
    }


    /**
     * String---》 int[]
     * @param input
     * @return
     */
    public static int[] stringToIntegerArray(String input) {
        input = input.trim();
        //input = input.substring(1, input.length() - 1);
        if (input.length() == 0) {
            return new int[0];
        }

        String[] parts = input.split(",");
        int[] output = new int[parts.length];
        for (int index = 0; index < parts.length; index++) {
            String part = parts[index].trim();
            output[index] = Integer.parseInt(part);
        }
        return output;
    }

    /**
     * String --> ListNode
     * @param input
     * @return
     */
    public static ListNode stringToListNode(String input) {
        // Generate array from the input
        int[] nodeValues = stringToIntegerArray(input);

        // Now convert that list into linked list
        // 如 492
        ListNode dummyRoot = new ListNode(0);
        // 上述492赋值给 ptr，即 pre==492
        ListNode ptr = dummyRoot;
        for (int item : nodeValues) {
            // 1. new 一个493，并赋值给 ptr.next,即 ptr.next ==493，即 492.next == 493
            // 2. new 一个494，再把                                  493.next == 494
            // 3. new 一个495，再把                                  494.next == 495
            ptr.next = new ListNode(item);
            // 把ptr.next。即把 493赋值给ptr， 即 ptr == 493
            //                              ptr == 494
            //                              ptr == 495
            ptr = ptr.next;
        }
        return dummyRoot.next;
    }


    public static String listNodeToString(ListNode node) {
        if (node == null) {
            return "[]";
        }

        String result = "";
        while (node != null) {
            result += Integer.toString(node.val) + ", ";
            node = node.next;
        }
        return "[" + result.substring(0, result.length() - 2) + "]";
    }


    public static void main(String[] args) throws IOException {

        ListNode listNode1 = stringToListNode("2,4,3,2");
        ListNode listNode2 = stringToListNode("5,6,4,9");

        ListNode listNode = addTwoNumbers(listNode1, listNode2);

        System.out.println(listNodeToString(listNode));
    }
}
